面试go
> go 安装第三方包
	>> 自动安装
		>>> go get xxx 这条命令会把远端的第三方包下载并解压到你的GOPATH路径下的src文件夹里面去，并执行go install xxx命令来安装该包,结果是在GOPATH路径的pkg文件夹生成xxx.a文件，实际上go get就是git clone + go install的组合
	>> 手动安装
		>>> 先下载该包，并按照该包官方的下载路径 为该包创建对应的gopath/src下里面的路径，注意这一步很关键！第三包在src里的路径不能随意放在一个文件夹中，因为第三方包内部的文件里还有对其它包的引用，如果随意放置会导致导入路径失效。将包移入到该路径，执行go install命令安装这个文件

> go项目
	>> https://github.com/zyxpaomian/tx-interview/blob/main/controller/docker.go
	>> 使用go实现，创建docker 容器，里面有mysql redis ceph不同版本资源的创建，查看删除等操作




面试k8s
> k8s 书籍
	>> https://chegva.com/4746.html
	>> https://ithaiq.gitbook.io/golang/golang-wei-fu-wu-shi-zhan/grpc/proto-gong-ju-cha-jian-ji




面试redis
redis 面试题
> https://blog.csdn.net/flyingwzb/article/details/83866215
> https://blog.csdn.net/u014229282/article/details/81174202

redis单线程
>  Redis 是基于内存的操作，CPU 不是 Redis 的瓶颈。Redis 的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现，而且 CPU 不会成为瓶颈，那就顺理成章地采用单线程的方案了。redis是单线程，采用事件驱动模型，对于每个cmd来说，都是原子的，不会有两条cmd同时执行，在这个方面不会有并发问题。
> 优势
	>> 避免了不必要的上下文切换和竞争条件
> 劣势
	>> 如果有条命令占用大量事件，后面的请求都会阻塞。
> 并发问题
	>> redis采用了线程封闭的观念，把任务封闭在一个线程，自然避免了线程安全的问题，但是对于依赖多个cmd的操作，还是需要锁，因为redis事务不保证原子性

redis
> 数据类型
	>> redis键的类型只能为字符串，值的类型有5种
	>> 字符串 STRING
		>>> 可以对整个字符串和字符串的一部分执行操作，将里面的值进行加减
	>> 列表 LIST
		>>> 加入弹出元素
	>> 集合 SET
		>>> 无序集合添加获取弹出元素，求交并补集
	>> 散列表HASH
		>>> 添加获取移除某个键值对
	>> 有序集合ZSET
		>>> 添加删除元素

> 字符串操作
	>> set $key $value
	>> get $key
	>> del $key

> 列表操作 l开头对应左边列表操作 r对应右边
	>> rpush $list-key $item 一个或多个值push到列表右边
	>> lpush $list-key $item push到左边
	>> lrange $list-key $index-start $index-end 获取范围内的元素
	>> lindex $list-key $index 查看索引对应的元素
	>> lpop $list-key        移除最左边元素

> 集合操作 s开头
	>> sadd
	>> smember
	>> sismember
	>> srem

> HASH h开头
	>> hset
	>> hgetall
	>> hdel
	>> hget

> 有序集合 z开头
	>> zadd
	>> zrange
	>> zrangebyscore
	>> zrem
	
> redis rehash
	>> 在创建hashmap的时候需要初始化容量（创建hash表时桶的数量），负载因子（临界值=负载因子*容量，当hashmap中元素个数达到容量*负载因子时会扩容 java默认为0.75），当达到临界值时，hash表会发生扩容，并将原有的对象重新分配到新的桶内，称为rehash，这个过程十分消耗性能，一般建议设置比较大的初始化容量，防止rehash
	>> redis
> 数据结构

redis优势
> 缓存 A数据，放在关系型数据库中，需要2s进行读取，读取之后放入redis中，之后对这个数据的获取都只用2ms，而且减小了结构化数据库的压力，极大的缩短访问的时间
> 排行榜 如果使用关系型数据库，比较麻烦，但是redis有序集合很适合做
> 计数器 类似文章访问数，点赞数这类操作，如果使用关系型数据库会进行频繁的磁盘io，如果使用redis将特别适合
> 消息队列 使用发布订阅模式进行程序解耦，可以使用list实现消息队列

redis 劣势
> redis的持久化方案不能保证数据绝对落地，不能用来存极其重要的数据
> 服务器内存很珍贵，数据量太大，访问频率太低，保存在内存中会浪费资源



> 持久化
	>> RDB 快照机制
		>>> 通过配置文件来进行快照生成，默认900s内进行了至少一次修改300s 10次 或60s 1w次，但是生成一次快照十分消耗性能（bgsave命令生成是全量快照（非增量））
	>> AOF 日志机制
		>>> 在发送写命令后进行AOF日志的记录，相当于增量记录，不过如果日志很大很多，恢复耗时比较长，重启redis后可以使用日志进行恢复。一般使用everysec的机制进行写入AOF日志的配置，这样不会影响服务器性能。如果redis服务停止，也最多损失1s的写操作
	>> RDB+AOF aof-use-rdb-preamble yes配置混合持久化，恢复速度快，消耗资源少，减少数据丢失的程度

> 数据淘汰策略
	>> 有8种机制，常见的LRU LFU机制
	>> LFU 最不经常使用算法 使用计数器进行统计被访问次数，次数最低的淘汰，缺点无法对一个拥有最初高访问率之后长时间没有被访问的条目缓存负责
	>> LRU 最近最少用算法 多使用一个年龄位，越早时间权重越低，解决了LFU的问题

> 事务
	>> 事务实现方式 使用multi和exec命令将多个cmd包裹。事务有一致性和隔离性，没有原子性和持久性。

go docker操作
> https://juejin.cn/post/6944730766052065288

TODO
> 面试python
> 面试 前端
> 了解 go 对docker k8s devops的支持
